/*===============================================
 *   文件名称：ultrasonic.c
 *   功能描述：超声波传感器驱动程序
 *   创 建 者: 麦穗飘飘
 *   创建日期：2024年12月16日   15:44:20
 *   描    述：超声波传感器驱动程序，通过串口通信，获取距离值。
 ================================================*/
#include "ultrasonic.h"
extern float Hcsr04GetLength;	// 超声波测距值

/* 设置非阻塞模式 */
void set_nonblocking(int sockfd) { 
    int flags = fcntl(sockfd, F_GETFL, 0);	// 获取文件描述符的当前标志
    if (flags < 0) {
        perror("fcntl get");
        return;
    }
    if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) {
        perror("fcntl set");
    }
}

/* 发送图像数据 */
void send_image(int connfd) {
    FILE *fp;
    char buffer[BUFFER_SIZE] = {0};
    const char *device_path = "/dev/video0"; // 设备路径
    const char *output_file_path = "photo.jpg"; // 输出文件路径
    int width = 640; // 图像宽度
    int height = 440;// 图像高度
    int pixel_format = V4L2_PIX_FMT_MJPEG; // 图像格式

    // 拍照上传
    take_picture(device_path, output_file_path, width, height, pixel_format);
    printf("USB camera take photo success: %s\n", output_file_path);

    // 打开文件
    fp = fopen(output_file_path, "rb");
    if (fp == NULL) {
        perror("fopen");
        return;
    }

    // 获取文件大小
    fseek(fp, 0, SEEK_END);
    uint64_t fileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    // 发送文件大小
    if (send(connfd, &fileSize, sizeof(fileSize), 0) != sizeof(fileSize)) {
        perror("send file size");
        fclose(fp);
        return;
    }

    // 发送文件内容
    size_t n;
    while ((n = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0) {
        if (send(connfd, buffer, n, 0) != n) {
            perror("send file content");
            fclose(fp);
            return;
        }
    }
    fclose(fp);
    printf("File sent successfully\n");
}
